package org.application.bean;

import java.util.ArrayList;
import java.util.List;

import javax.enterprise.context.RequestScoped;
import javax.enterprise.inject.Produces;
import javax.inject.Inject;
import javax.inject.Named;
import javax.persistence.EntityManager;
import javax.persistence.NoResultException;

import org.application.model.Paciente;
import org.phonetic.model.PacientePhoneticCode;
import org.phonetic.model.PhoneticCode;

import br.com.p2d.phonetizer.FonetizacaoBR;


@RequestScoped
@Named("dataFactory")
public class DataFactory {

	@Inject
	private PacienteDao pacienteDao;
	
	@DataRepository
	@Inject
	private EntityManager entityManager;
	

	@Produces
	@Named("createData")
	public void createData() {
		/*List<Paciente> list = this.pacienteDao.getAll();
		int countPacientes =  list.size();
		if(countPacientes == 0){
			createPacientes();
		}
		else{
			fonetize(list);
		}*/
	}
	
	private void fonetize(List<Paciente> list) {
		int cont = 0;
		for(Paciente paciente : list){
			System.out.println(++cont + ": fonetizando "+paciente.getNome());
			ArrayList<String> strings = FonetizacaoBR.makeAllPhoneticCodes(paciente.getNome());
			entityManager.getTransaction().begin();
			for(String string : strings){
				PhoneticCode phoneticCode = null;
				try {
					phoneticCode = (PhoneticCode) entityManager.createQuery("SELECT pc FROM PhoneticCode pc WHERE pc.hash = :hash").setParameter("hash", string).getSingleResult();
				} catch (NoResultException e) {
					phoneticCode = new PhoneticCode();
					phoneticCode.setHash(string);

					entityManager.persist(phoneticCode);

					//entityManager.flush();

					entityManager.refresh(phoneticCode);
				}
				
				PacientePhoneticCode relacionamento = new PacientePhoneticCode();
				relacionamento.setPhoneticCode(phoneticCode);
				relacionamento.setPaciente(paciente);

				entityManager.persist(relacionamento);

				//entityManager.flush();
			}
			entityManager.getTransaction().commit();
		}
	}

	private void createPacientes() {

		Paciente paciente = new Paciente();
		paciente.setNome("Antonio Raphael Machado da Silva");
		
		pacienteDao.save(paciente);
		
		paciente = new Paciente();
		paciente.setNome("Alexandre Manoel Rafael");
		
		pacienteDao.save(paciente);
		
		paciente = new Paciente();
		paciente.setNome("Alan Bruno Ferreira da Silva");
		
		pacienteDao.save(paciente);
		
		paciente = new Paciente();
		paciente.setNome("Adriana Márcia Aguiar Sousa");
		
		pacienteDao.save(paciente);
		
		paciente = new Paciente();
		paciente.setNome("Airton Correia de Oliveira");
		
		pacienteDao.save(paciente);
		
		paciente = new Paciente();
		paciente.setNome("Ayrton Senna");
		
		pacienteDao.save(paciente);
		
		paciente = new Paciente();
		paciente.setNome("Américo Correia Souza");
		
		pacienteDao.save(paciente);
	}
}
